<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    "use strict";

    // ES5 严格模式
    // 起源, JS是弱类型的语言,代码在执行过程中存在诸多不合理,不严谨,不安全的地方
    // 严格模式是JS发展过程中的一次尝试, 为了解决 代码在执行过程中存在诸多不合理,不严谨,不安全的地方, 提高代码的执行效率 为以后做准备

    // 如何进入严格模式?
    // 在作用域的最前面 添加 "use strict";
    // a. 全局作用域  当前script脚本的最前面添加
    // b. 函数作用域  函数的最前面添加

    // function demo() {
    //     "use strict"
    // }


    // (1) 严格模式下,声明变量需要使用关键词 var, 不通过关键词直接声明变量 => 会报错
    // var a = 10;
    // b = 20;
    // console.log(a, b);


    // (2)  严格模式下,函数在调用时需要有依存的对象 => 如果没有依存的对象 默认指向undefined
    // function fn() {
    //     console.log(this);
    // }
    // window.fn(); //  this -> window
    // fn();  //  this -> undefined

    // function wrap() {
    //     function fn() {
    //         console.log(this);
    //     }
    //     fn(); // this -> undefined
    // }

    // wrap();

    // (3)  严格模式下, 函数的参数名不允许重复 => 重复使用会报错
    // function sum(a, b, b) {
    //     console.log(a, b);
    //     return a + b;
    // }

    // // sum(1, 2); //3
    // var result = sum(1, 2, 3);
    // console.log(result);

    // (4) 严格模式下,新增eval()作用域 => 在eval中声明的变量 也是局部的
    // eval("debugger; var x = 1;var y = 2;var z = x + y;");
    // console.log(x, y, z);

    // (5) 严格模式下,如果对象的属性不允许删除 => 强制删除会报错
    // var obj = { a: 1, b: 2, c: 3, d: 4 };

    // console.log(delete obj.a);
    // console.log(delete obj.b);
    // console.log(delete obj.c);
    // console.log(delete obj.d);

    // console.log(obj);

    // var obj = new String("hello");

    // console.log(delete obj[0]);
    // console.log(delete obj[1]);
    // console.log(delete obj[2]);
    // console.log(delete obj[3]);
    // console.log(delete obj[4]);
    // console.log(obj);

    // 存在在window中的全局变量 也不允许被删除
    // var a = 10;
    // var b = 20;

    // console.log(delete window.a);
    // console.log(delete window.b);




</script>

</html>